/*****************************************************************************/
/*                        >>> func_PCNIPC.c -- <<<                           */
/*	Trabajo Practico 2do. cuatrimestre 2011                                  */
/*	TP:"FUSELAJE"                                                            */
/*	GRUPO: Reduce Fat Fast                                                   */
/*	INTEGRANTES: Emanuel Genovese                                            */
/*               Federico Gabriel Garcia                                     */
/*               Federico Pioli                                              */
/*               Esther Insfrain                                             */
/*               Luciano Bagattin                                            */
/*	Fecha UM:                                                                */
/*****************************************************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include "../headers/func_PCNIPC.h"
#include "../headers/constantes.h"
#include "constants_commons.h"
#include "func_ipc.h"







/******************************************************************************/
/* Nombre de Funcion: fSendIPCCXsocket                                        */
/* Parametros: socket: socket por el cual se comunica                         */
/*             st: estructura que parseara para enviarlo a otros procesos     */
/*             log: archivo de log                                            */
/* Descripcion: Funcion que envia al Ppd la posicion del cabezal              */
/******************************************************************************/

int fSendIPCCXsocket(int iSocket,stNIPC st, t_log * log){
/*declaracion de variables locales*/

	int iOperados=-11, fEnvio_OK=0;
	t_stream *t;
	char sPipo[1024];


    if ( strcmp ( st.sDescriptorOriginal, "NULL" ) == 0 )	{
    		memcpy(st.sDescriptorOriginal,(char*) fGenerar_Desc_ID ( ) , 16);
    }//fin del if

      switch(st.iPayloadDescriptor){
        case POSICIONCABEZAL:



            t= stNIPC_serializer(&st, st.sPayload, NULL);
          break;
        case LECTURA:

        	t=stNIPC_serializer(&st, st.sPayload, stPLecturaSector_serializer);
          break;
        case ESCRITURA:
        	t=stNIPC_serializer(&st, st.sPayload, stPEscrituraSector_serializer);
          break;

      }
    /*Serializacion de la estructura de envio*/


/*fin de la declaracion de variables locales*/

	if (iSocket != -1){

			while ( fEnvio_OK == 0 ){

				if ( ( iOperados = send ( iSocket , t->data , t->length , 0 ) ) == -1 ){


					fEnvio_OK = 2;
				}
				if ( t->length == iOperados ) fEnvio_OK = 1;
				if ( iOperados == 0 ) fEnvio_OK = 2;
	         }//fin del while


			if ( fEnvio_OK == 2 ) iOperados = -1;
	}//fin del if
	sprintf(sPipo,"%d%d",fEnvio_OK, iOperados);
puts(sPipo);
return (iOperados == -1)? 0:iOperados;
}//fin del fSendIPCCXsocket

/******************************************************************************/
/* Nombre de Funcion: fRecvIPCCXsocket                                        */
/* Parametros: socket: socket por el cual se comunica                         */
/*             stR: estructura donde parseara todo lo qeu le envia el PPD     */
/*               log: archivo de log                                          */
/* Descripcion: Funcion que envia al Ppd la posicion del cabezal              */
/******************************************************************************/

int fRecvIPCCXsocket(int iSocket, stNIPC *stR , t_log * log){
/*declaracion de variables locales*/
	char *cadHeader=NULL;
    char *cadPayload=NULL;
	int iMaxBuffer, iOperados, iFlag;
	t_stream * p=malloc(sizeof(t_stream));
	t_stream * q=malloc(sizeof(t_stream));


/*fin de la declaracion de variables locales*/


	cadHeader=malloc(sizeof(char)*16+sizeof(int)+sizeof(short int));
	iMaxBuffer= (sizeof(char)*16)+sizeof(int)+sizeof(short int);
	iOperados = recv(iSocket, cadHeader ,iMaxBuffer,0);
    iFlag=1;
    if ((iOperados == -1) ||(iOperados == 0)){
    	log_error(log, NOMBREPROCESO, "Message error: %s", "Error en el recv del NIPC");

        iFlag=0;
        iOperados=-1;
    }//fin del if

    log_info(log, NOMBREPROCESO, "Message info: %s", "Exito en el recv del NIPC");
    p->data=cadHeader;
    p->length=strlen(cadHeader)+1;
    stR=stNIPC_deserializer(p);
    if(stR->sPayload_lenth>0){
      iOperados=recv(iSocket,cadPayload,stR->sPayload_lenth,0);
      if ((iOperados == -1) ||(iOperados == 0)){
        	log_error(log, NOMBREPROCESO, "Message error: %s", "Error en el recv del NIPC");

            iFlag=0;
            iOperados=-1;
      }//fin del if

    }
    if(iFlag){

    	switch(stR->iPayloadDescriptor){

    	   case POSICIONCABEZAL:
    		   stR->sPayload=stPLecturaSector_deserializer(q);

    		 break;
    	   case ESCRITURA:
    		   stR->sPayload=stPLecturaSector_deserializer(q);
    		 break;
    	   case LECTURA:
    		   stR->sPayload=stTrace_deserializer(q);
    		 break;

    	}//fin del switch

    }//fin del if


return 0;
}//fin del fRecvIPCCXsocket
